gtkwindow: Fix "shadowed" checks for GTK grabs
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 17 May 2021 21:57:17 +0000 (23:57 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 17 May 2021 22:16:55 +0000 (00:16 +0200)
We iterate here from the target widget up the toplevel checking
for the previous and new grab, there's however 2 bugs here:
- The check for is_shadowed was different to the check for was_shadowed
- The loop started with the assumption that the widgets did not hold
  a grab, just to change it if the grab widget was found. (or maybe
  it's the other way around? it's unclear with the differing checks
  for past/present state).

Make these checks consistent, and ensure we start with the right
assumption for the past/present grabbing state, and accounting that
new/old grab widgets may or may not be part of the pick stack.

gtk/gtkwindow.c

index 33e1379a25461822769663393e55ebf6d77d3d11..5d6ba32897a39a87235cfb0896a200ab667f11e6 100644 (file)
@@ -6748,6 +6748,10 @@ gtk_window_propagate_grab_notify (GtkWindow *window,
 
   while (target)
     {
+      if (target == old_grab_widget)
+        was_grabbed = TRUE;
+      if (target == new_grab_widget)
+        is_grabbed = TRUE;
       widgets = g_list_prepend (widgets, g_object_ref (target));
       target = gtk_widget_get_parent (target);
     }
@@ -6758,11 +6762,13 @@ gtk_window_propagate_grab_notify (GtkWindow *window,
     {
       gboolean was_shadowed, is_shadowed;
 
-      was_grabbed |= (l->data == old_grab_widget);
-      is_grabbed |= (l->data == new_grab_widget);
-
       was_shadowed = old_grab_widget && !was_grabbed;
-      is_shadowed = new_grab_widget && is_grabbed;
+      is_shadowed = new_grab_widget && !is_grabbed;
+
+      if (l->data == old_grab_widget)
+        was_grabbed = FALSE;
+      if (l->data == new_grab_widget)
+        is_grabbed = FALSE;
 
       if (was_shadowed == is_shadowed)
         break;